import os
import random
from colorama import Fore, init

from moviepy import AudioFileClip, VideoFileClip, concatenate_videoclips, CompositeAudioClip, AudioClip

from tools.common import 获取指定目录下的所有文件的绝对路径, 判断list中的元素都一样, 随机抽取元素, 从文件路径中获取文件名
from 剪辑工具.movie_cut_tools import 过滤只有视频文件, 过滤只有音频文件, 判断一系列视频文件的帧数是多少, 判断视频的宽高是多少

init()


def 通过音频配视频(音频: AudioClip, 视频素材文件名库: 随机抽取元素, 输出文件名: str, 保存视频的音频 = False):
    """
    通过音频顺序拼接配视频
    :param 音频:
    :param 视频素材文件名库:
    :param 输出文件名:
    :param 保存视频的音频:
    :return:
    """
    总时长, 当前时长 = 音频.duration, 0
    需要释放的资源 = []
    拼接的视频片段 = []
    while 当前时长 < 总时长:
        视频素材路径 = 视频素材文件名库.随机抽取()
        视频 = VideoFileClip(视频素材路径).resized(height=1920)
        需要释放的资源.append(视频)
        if not 保存视频的音频:
            视频.audio = None

        当前时长 += 视频.duration
        if 当前时长 > 总时长:
            多的时长 = 当前时长 - 总时长
            视频 = 视频.subclipped(end_time=视频.duration - 多的时长)
        拼接的视频片段.append(视频)

    # 顺序拼接
    顺序拼接的视频 = concatenate_videoclips(拼接的视频片段, method="compose")
    顺序拼接的视频.audio = 音频
    顺序拼接的视频.write_videofile(输出文件名, codec="libx264", audio_codec="aac")


if __name__ == '__main__':
    输出目录 = "output"
    if not os.path.exists(输出目录):
        os.makedirs(输出目录)

    所有视频素材目录文件 = 获取指定目录下的所有文件的绝对路径("sucai/video/ap", recursion=True) + 获取指定目录下的所有文件的绝对路径(r"E:\数字人批量文案\素材", recursion=True)
    视频素材文件 = 过滤只有视频文件(所有视频素材目录文件)
    所有音频素材目录文件 = 获取指定目录下的所有文件的绝对路径(r"E:\pythonProjects\cutVideo\sucai\audio\xiaoshuo", recursion=True)
    音频素材文件 = 过滤只有音频文件(所有音频素材目录文件)

    # # TODO: 这一步特别占内存，需要优化
    # if not 判断list中的元素都一样(判断一系列视频文件的帧数是多少([VideoFileClip(视频) for 视频 in 视频素材文件])):
    #     print(Fore.YELLOW + "视频帧数不一致" + Fore.RESET)
    # if not 判断list中的元素都一样(判断视频的宽高是多少([VideoFileClip(视频).size for 视频 in 视频素材文件])):
    #     print(Fore.YELLOW + "视频宽高不一致" + Fore.RESET)
    #     quit(0)

    视频素材文件名库 = 随机抽取元素(视频素材文件)
    print(f"{Fore.GREEN}把所有的素材都变成了高度为1920的竖版视频 {Fore.RESET}")
    print(f"{Fore.RED}如果有横板的视频，输出的视频会有问题{Fore.RESET}")

    for i in 音频素材文件:
        音频 = AudioFileClip(i)

        音频文件名 = 从文件路径中获取文件名(i)
        输出目录文件名 = os.path.join(输出目录, f"{音频文件名}.mp4")

        通过音频配视频(音频.with_volume_scaled(1.5), 视频素材文件名库, 输出目录文件名, 保存视频的音频=True)
        # 按音频的名字保存视频
        音频.close()
